#ifndef GPSCONTROLLER_H
#define GPSCONTROLLER_H

#include <QObject>
#include <QQmlEngine>
#include <QSettings>
#include "nmeaparser.h"
#include "serialportmanager.h"

/**
 * @brief GPS控制器类
 * 
 * 该类作为QML和C++后端的桥梁，整合串口管理和NMEA解析功能
 * 提供给QML界面使用的属性和方法
 */
class GpsController : public QObject
{
    Q_OBJECT
    QML_ELEMENT

    // GPS数据属性
    Q_PROPERTY(double latitude READ latitude NOTIFY gpsDataChanged)
    Q_PROPERTY(double longitude READ longitude NOTIFY gpsDataChanged)
    Q_PROPERTY(double altitude READ altitude NOTIFY gpsDataChanged)
    Q_PROPERTY(double speed READ speed NOTIFY gpsDataChanged)
    Q_PROPERTY(double course READ course NOTIFY gpsDataChanged)
    Q_PROPERTY(int satellites READ satellites NOTIFY gpsDataChanged)
    Q_PROPERTY(QString quality READ quality NOTIFY gpsDataChanged)
    Q_PROPERTY(QString timestamp READ timestamp NOTIFY gpsDataChanged)
    Q_PROPERTY(bool isValid READ isValid NOTIFY gpsDataChanged)

    // 串口属性
    Q_PROPERTY(QStringList availablePorts READ availablePorts NOTIFY availablePortsChanged)
    Q_PROPERTY(bool isConnected READ isConnected NOTIFY connectionStatusChanged)
    Q_PROPERTY(QString currentPort READ currentPort NOTIFY currentPortChanged)
    Q_PROPERTY(int baudRate READ baudRate WRITE setBaudRate NOTIFY baudRateChanged)

    // 状态属性
    Q_PROPERTY(QString statusMessage READ statusMessage NOTIFY statusMessageChanged)
    Q_PROPERTY(int receivedMessages READ receivedMessages NOTIFY receivedMessagesChanged)

public:
    explicit GpsController(QObject *parent = nullptr);

    // GPS数据访问器
    double latitude() const;
    double longitude() const;
    double altitude() const;
    double speed() const;
    double course() const;
    int satellites() const;
    QString quality() const;
    QString timestamp() const;
    bool isValid() const;

    // 串口访问器
    QStringList availablePorts() const;
    bool isConnected() const;
    QString currentPort() const;
    int baudRate() const;
    void setBaudRate(int rate);

    // 状态访问器
    QString statusMessage() const;
    int receivedMessages() const;

public slots:
    /**
     * @brief 连接到指定串口
     * @param portName 串口名称
     * @param baudRate 波特率
     * @return 连接是否成功
     */
    Q_INVOKABLE bool connectToPort(const QString &portName, int baudRate = 9600);

    /**
     * @brief 断开串口连接
     */
    Q_INVOKABLE void disconnectPort();

    /**
     * @brief 刷新可用串口列表
     */
    Q_INVOKABLE void refreshPorts();

    /**
     * @brief 清除GPS数据
     */
    Q_INVOKABLE void clearGpsData();

    /**
     * @brief 获取格式化的坐标字符串
     * @return 格式化的坐标
     */
    Q_INVOKABLE QString getFormattedCoordinates() const;

    /**
     * @brief 自动连接到上次成功的串口
     */
    Q_INVOKABLE bool autoConnectToLastPort();

    /**
     * @brief 获取上次成功连接的串口名称
     * @return 串口名称
     */
    Q_INVOKABLE QString getLastConnectedPort() const;

    /**
     * @brief 获取上次成功连接的波特率
     * @return 波特率
     */
    Q_INVOKABLE int getLastConnectedBaudRate() const;

    double getSpeedKmh() const;

signals:
    // GPS数据信号
    void gpsDataChanged();

    // 串口信号
    void availablePortsChanged();
    void connectionStatusChanged();
    void currentPortChanged();
    void baudRateChanged();

    // 状态信号
    void statusMessageChanged();
    void receivedMessagesChanged();
    void errorOccurred(const QString &error);

private slots:
    /**
     * @brief 处理GPS数据更新
     * @param gpsData 新的GPS数据
     */
    void onGpsDataUpdated(const GpsData &gpsData);

    /**
     * @brief 处理NMEA行数据
     * @param line NMEA数据行
     */
    void onNmeaLineReceived(const QString &line);

    /**
     * @brief 处理解析错误
     * @param error 错误信息
     */
    void onParseError(const QString &error);

    /**
     * @brief 处理串口错误
     * @param error 错误信息
     */
    void onSerialError(const QString &error);

private:
    SerialPortManager *m_serialPortManager;  // 串口管理器
    NmeaParser *m_nmeaParser;               // NMEA解析器
    GpsData m_currentGpsData;               // 当前GPS数据
    QString m_statusMessage;                // 状态消息
    int m_receivedMessages;                 // 接收到的消息数量
    QSettings *m_settings;                  // 设置存储

    /**
     * @brief 更新状态消息
     * @param message 新的状态消息
     */
    void updateStatusMessage(const QString &message);

    /**
     * @brief 保存成功连接的串口信息
     * @param portName 串口名称
     * @param baudRate 波特率
     */
    void saveLastConnectedPort(const QString &portName, int baudRate);
};

#endif // GPSCONTROLLER_H
